/**
 * 
 */
package org.yelongframework.spring.web.servlet.handler.interceptor;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import org.yelongframework.commons.lang.annotation.AnnotationUtil;

/**
 * 抽象mvc拦截器。 提供一些拦截器常用的方法
 * 
 * 可以在拦截器中抛出异常，由异常处理器来处理这些异常
 * 
 * @since 1.0.0
 */
public abstract class AbstractHandlerInterceptor extends HandlerInterceptorAdapter {

	/**
	 * 获取handler方法上面的的注解。如果方法上面没有到，则根据该方法所属的类层级递归查找
	 * 
	 * @param <A>        annotation type
	 * @param handler    处理器
	 * @param annotation 注解
	 * @return annotation
	 */
	protected <A extends Annotation> A getHandlerMethodAnnotation(HandlerMethod handler, Class<A> annotation) {
		return getHandlerMethodAnnotation(handler, annotation, true);
	}

	/**
	 * 获取handler方法上面的的注解。
	 * 
	 * @param <A>            annotation type
	 * @param handler        处理器
	 * @param annotation     注解
	 * @param classRecursive 类递归。<tt>true</tt> 如果方法上面没有到，则根据该方法所属的类层级递归查找
	 * @return annotation
	 */
	protected <A extends Annotation> A getHandlerMethodAnnotation(HandlerMethod handler, Class<A> annotation,
			boolean classRecursive) {
		Method method = handler.getMethod();
		if (method.isAnnotationPresent(annotation)) {
			return method.getAnnotation(annotation);
		}
		if (!classRecursive) {
			return null;
		}
		Class<?> c = handler.getBeanType();
		return AnnotationUtil.getAnnotation(c, annotation, true);
	}

}
